#include "StringUtil.h"

namespace Util
{
    int Split(const string& Line, vector<string>& Elements, const string& Delimiter, int Count)
    {
        Elements.clear();

        //空字符串不用处理直接返回
        if( Line.empty() )
            return -1;

        //负数的切割不用进行
        if( Count < 0 )
            return 0;

        if( Count == 0 )
        {
            Count = numeric_limits<int>::max();
        }

        //用来统计当前分割的次数
        int NowCount = 0;

        //记录分割符的位置
        string::size_type bPos = 0;
        string::size_type ePos = 0;

        while( (ePos = Line.find(Delimiter, bPos)) != string::npos )
        {
            //注意，这里得到的Item可能会是一个空字符串
            string Item = Line.substr( bPos, ePos - bPos );

            bPos = ePos + Delimiter.size();
            Elements.push_back( Item );

            //统计已经分割的次数
            ++NowCount;
            if( NowCount >= Count )
            {
                break;
            }
        }

        //当While循环结束时，可能没有找到最后的一个delimiter,比如"a,b"
        //只有一个","号，但实际上分割后有两个元素
        if( ePos == string::npos && NowCount < Count )
        {
            string Item = Line.substr( bPos );
            Elements.push_back( Item );
        }

        if( Elements.empty() )
            return -1;

        return static_cast<int>( Elements.size() );
    }

    int Split(const string& Line, vector<string>& Elements, char Delimiter, int Count)
    {
        Elements.clear();

        //空字符串不处理
        if( Line.empty() )
            return -1;

        //切割数小于0的则直接返回
        if( Count < 0 )
            return 0;

        //Count==0则认为当前为最大的分割数
        if( Count == 0 )
            Count = numeric_limits<int>::max();

        istringstream Reader(Line);
        string Item;

        int NowCount = 0;
        while(getline(Reader, Item, Delimiter) && NowCount < Count)
        {
            Elements.push_back(Item);
            ++NowCount;
        }

        return static_cast<int>( Elements.size() );
    }

};

